package examples.org.apache.hc.client5.http.examples;

import org.apache.hc.client5.http.impl.sync.CloseableHttpClient;
import org.apache.hc.client5.http.impl.sync.HttpClients;
import org.apache.hc.client5.http.methods.CloseableHttpResponse;
import org.apache.hc.client5.http.methods.HttpGet;
import org.apache.hc.client5.http.protocol.HttpClientContext;
import org.apache.hc.core5.http.HttpEntity;

import java.security.Principal;

/**
 * Created by dycong on 2017/3/9.
 */
public class ClientWithUserToken {
/*HttpClient依赖于’UserTokenHandler’接口来确定给定的执行上下文是否为用户特定的。如果是，则该处理程序返回的令牌对象应该
唯一标识当前用户，如果上下文不包含当前用户特有的任何资源或详细信息，则该对象将为null。 用户令牌将用于确保用户特定资源不会被
其他用户共享或重复使用。

‘UserTokenHandler’接口的默认实现类作为Principal类的实例来表示HTTP连接的状态对象，如果它可以从给定的执行上下文获得的话。
‘DefaultUserTokenHandler’将使用基于连接的认证方案（例如’NTLM’）或使用客户端认证的SSL会话的用户主体。 如果两者都不可用，
将返回NULL令牌。

请注意，只有当执行请求时相同的状态对象绑定到执行上下文时，携带状态对象的持久连接才可重复使用。因此，确保用户执行后续HTTP请求
时重用了相同的上下文或用户令牌在请求执行之前就被绑定到上下文，是非常重要的。
*/
    public static void main(String[] args)throws Exception {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpClientContext context1 = HttpClientContext.create();
        HttpGet httpget1 = new HttpGet("http://httpbin.org/get");
        CloseableHttpResponse response1 = httpclient.execute(httpget1, context1);
        try {
            HttpEntity entity1 = response1.getEntity();
        } finally {
            response1.close();
        }
        Principal principal = context1.getUserToken(Principal.class);

        HttpClientContext context2 = HttpClientContext.create();
        context2.setUserToken(principal);
        HttpGet httpget2 = new HttpGet("http://httpbin.org/get");
        CloseableHttpResponse response2 = httpclient.execute(httpget2, context2);
        try {
            HttpEntity entity2 = response2.getEntity();
        } finally {
            response2.close();
        }
    }
}
